Skip to content

Comments

refactor!: remove memory, catalog, and clean up API#2

Merged
zoobzio merged 3 commits intomainfrom
refactor/cut-fat
Feb 22, 2026
Merged

refactor!: remove memory, catalog, and clean up API#2
zoobzio merged 3 commits intomainfrom
refactor/cut-fat

Conversation

@zoobzio
Copy link
Owner

@zoobzio zoobzio commented Feb 22, 2026

BREAKING CHANGE: Memory, Embedder, Vector, and Catalog interfaces removed. Users should implement persistence as custom pipz.Chainable[*Thought] primitives.

  • Remove Memory interface and all persistence primitives (Seek, Survey, Recall, Checkpoint, Restore, Forget)
  • Remove Embedder interface and OpenAI embedder implementation
  • Remove Vector type (pgvector wrapper)
  • Remove Catalog interface and data primitives (Fetch, Discover, Relate)
  • Simplify Thought constructors: New/NewWithTrace no longer require Memory or return error
  • Remove NewForTask constructor and TaskID field (orphaned after memory removal)
  • MarkNotesPublished now accepts context.Context for traceable signal emission
  • Remove unreachable error path in Prioritize.resolveItems
  • Fix typo in Thought.Clone documentation
  • Update all documentation to reflect changes

Summary by CodeRabbit

  • Breaking Changes

    • Persistence and embedding APIs removed; Thought constructors simplified (no persistence backend). Note publication now requires a context parameter.
  • Removed Features

    • Catalog, fetch, discover, relate primitives; embedder/OpenAI integration and vector embeddings; semantic search primitives (seek, survey, recall); checkpoint/restore/forget/task-oriented flows.
  • Documentation

    • Docs revised to a simplified Thought–Note architecture and updated quickstart/reference examples.

BREAKING CHANGE: Memory, Embedder, Vector, and Catalog interfaces removed.
Users should implement persistence as custom pipz.Chainable[*Thought] primitives.

- Remove Memory interface and all persistence primitives
  (Seek, Survey, Recall, Checkpoint, Restore, Forget)
- Remove Embedder interface and OpenAI embedder implementation
- Remove Vector type (pgvector wrapper)
- Remove Catalog interface and data primitives
  (Fetch, Discover, Relate)
- Simplify Thought constructors: New/NewWithTrace no longer
  require Memory or return error
- Remove NewForTask constructor and TaskID field (orphaned
  after memory removal)
- MarkNotesPublished now accepts context.Context for
  traceable signal emission
- Remove unreachable error path in Prioritize.resolveItems
- Fix typo in Thought.Clone documentation
- Update all documentation to reflect changes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link

coderabbitai bot commented Feb 22, 2026

📝 Walkthrough

Walkthrough

This PR removes persistence, embedding, catalog, and many discovery/search primitives, simplifies the Thought/Note public API (constructors no longer require Memory; MarkNotesPublished now accepts a context), and updates docs, tests, and benchmarks to the new two-concept model.

Changes

Cohort / File(s) Summary
Memory & Embedding Core
memory.go, embedder.go, vector.go, mock_memory_test.go, embedder_test.go, vector_test.go
Deleted the Memory and Embedder public APIs, Vector type, OpenAI embedder implementation, and the in-memory test mock; removes persistence, embedding, and vector DB-related logic and tests.
Catalog & Resource Discovery
catalog.go, catalog_test.go, discover.go, discover_test.go, fetch.go, fetch_test.go, relate.go, relate_test.go
Removed catalog abstraction, context/global catalog helpers, and primitives for Discover/Fetch/Relate plus their tests and rendering utilities.
Semantic Search & Summarization Primitives
seek.go, seek_test.go, survey.go, survey_test.go, recall.go, recall_test.go, signals.go
Deleted Seek, Survey, and Recall primitives, related signals/fields (search metadata), and all associated tests; removes embedder- and search-dependent workflows and signals.
Checkpoint / Restore / Forget Primitives
checkpoint.go, checkpoint_test.go, restore.go, restore_test.go, forget.go, forget_test.go
Removed checkpointing, restore, and forget primitives and their tests, eliminating the public APIs and processing flows for these operations.
Thought & Note API Simplification
thought.go, thought_test.go, assess.go, analyze.go, amplify.go, categorize.go, converge.go, decide.go, discern.go, sift.go, prioritize.go, reflect_test.go, signals_test.go
Removed Note.Embedding and Thought.TaskID and persistence/embedder fields; constructors changed to New(ctx, intent) / NewWithTrace(ctx, intent, traceID) returning *Thought; MarkNotesPublished()MarkNotesPublished(ctx context.Context) and many call-sites/tests updated to pass ctx.
Testing & Helpers Simplification
testing/helpers.go, testing/helpers_test.go, testing/benchmarks/benchmarks_test.go
Removed MockMemory and memory-backed helpers; updated test helpers and benchmarks to construct Thoughts via simplified New API and removed memory-dependent setups.
Docs & API Reference
api.go, docs/1.overview.md, docs/2.learn/1.quickstart.md, docs/2.learn/2.concepts.md, docs/2.learn/3.architecture.md, docs/5.reference/1.api.md
Rewrote documentation to a Thought–Note model: removed memory/embedder/catalog from examples/reference, updated API signatures and examples, revised primitives and timestamps.
Module tidy
go.mod
Removed github.com/zoobzio/atom dependency from module file.

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Poem

🐰 I hopped through lines and pruned the tangled vine,
I nudged out memory, vectors, and a catalog fine.
Two petals left—Thought and Note—neat and small,
I twitched my nose, then left the rest to fall.
A rabbit’s nibble made the codebase tidy and fine.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically summarizes the main breaking changes: removal of memory, catalog, and API cleanup. It directly reflects the primary refactoring objective.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch refactor/cut-fat

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

📋 Version Preview

Current: v0.0.2
Next: v0.1.0

Version will be applied when PR is merged and release triggered.

@github-actions
Copy link

github-actions bot commented Feb 22, 2026

📊 Coverage Report

Total Coverage: 75.5%

Metric Value
Covered Lines 100
Uncovered Lines 172
Total Lines 272

Coverage by Package

github.com/zoobzio/cogito/amplify.go:67:		NewAmplify			100.0%
github.com/zoobzio/cogito/amplify.go:83:		Process				77.6%
github.com/zoobzio/cogito/amplify.go:225:		emitFailed			0.0%
github.com/zoobzio/cogito/amplify.go:236:		Identity			100.0%
github.com/zoobzio/cogito/amplify.go:241:		Schema				0.0%
github.com/zoobzio/cogito/amplify.go:246:		Close				100.0%
github.com/zoobzio/cogito/amplify.go:251:		Scan				71.4%
github.com/zoobzio/cogito/amplify.go:266:		WithProvider			0.0%
github.com/zoobzio/cogito/amplify.go:272:		WithTemperature			100.0%
github.com/zoobzio/cogito/amplify.go:278:		WithRefinementTemperature	100.0%
github.com/zoobzio/cogito/amplify.go:284:		WithCompletionTemperature	100.0%
github.com/zoobzio/cogito/amplify.go:290:		WithMaxIterations		75.0%
github.com/zoobzio/cogito/analyze.go:50:		NewAnalyze			100.0%
github.com/zoobzio/cogito/analyze.go:61:		Process				68.8%
github.com/zoobzio/cogito/analyze.go:141:		runIntrospection		100.0%
github.com/zoobzio/cogito/analyze.go:152:		buildIntrospectionInput		80.0%
github.com/zoobzio/cogito/analyze.go:169:		emitFailed			0.0%
github.com/zoobzio/cogito/analyze.go:180:		Identity			0.0%
github.com/zoobzio/cogito/analyze.go:185:		Schema				0.0%
github.com/zoobzio/cogito/analyze.go:190:		Close				0.0%
github.com/zoobzio/cogito/analyze.go:196:		Scan				0.0%
github.com/zoobzio/cogito/analyze.go:212:		WithProvider			0.0%
github.com/zoobzio/cogito/analyze.go:218:		WithTemperature			0.0%
github.com/zoobzio/cogito/analyze.go:224:		WithIntrospection		100.0%
github.com/zoobzio/cogito/analyze.go:230:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/analyze.go:236:		WithReasoningTemperature	100.0%
github.com/zoobzio/cogito/analyze.go:242:		WithIntrospectionTemperature	100.0%
github.com/zoobzio/cogito/assess.go:43:			NewAssess			100.0%
github.com/zoobzio/cogito/assess.go:53:			Process				65.6%
github.com/zoobzio/cogito/assess.go:133:		runIntrospection		100.0%
github.com/zoobzio/cogito/assess.go:144:		buildIntrospectionInput		75.0%
github.com/zoobzio/cogito/assess.go:181:		emitFailed			0.0%
github.com/zoobzio/cogito/assess.go:192:		Identity			0.0%
github.com/zoobzio/cogito/assess.go:197:		Schema				0.0%
github.com/zoobzio/cogito/assess.go:202:		Close				0.0%
github.com/zoobzio/cogito/assess.go:207:		Scan				71.4%
github.com/zoobzio/cogito/assess.go:222:		WithProvider			0.0%
github.com/zoobzio/cogito/assess.go:228:		WithTemperature			0.0%
github.com/zoobzio/cogito/assess.go:234:		WithIntrospection		100.0%
github.com/zoobzio/cogito/assess.go:240:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/assess.go:246:		WithReasoningTemperature	0.0%
github.com/zoobzio/cogito/assess.go:252:		WithIntrospectionTemperature	0.0%
github.com/zoobzio/cogito/categorize.go:45:		NewCategorize			100.0%
github.com/zoobzio/cogito/categorize.go:57:		Process				68.8%
github.com/zoobzio/cogito/categorize.go:138:		runIntrospection		100.0%
github.com/zoobzio/cogito/categorize.go:149:		buildIntrospectionInput		100.0%
github.com/zoobzio/cogito/categorize.go:173:		emitFailed			0.0%
github.com/zoobzio/cogito/categorize.go:184:		Identity			0.0%
github.com/zoobzio/cogito/categorize.go:189:		Schema				0.0%
github.com/zoobzio/cogito/categorize.go:194:		Close				0.0%
github.com/zoobzio/cogito/categorize.go:199:		Scan				71.4%
github.com/zoobzio/cogito/categorize.go:214:		WithProvider			0.0%
github.com/zoobzio/cogito/categorize.go:220:		WithTemperature			0.0%
github.com/zoobzio/cogito/categorize.go:226:		WithIntrospection		100.0%
github.com/zoobzio/cogito/categorize.go:232:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/categorize.go:238:		WithReasoningTemperature	100.0%
github.com/zoobzio/cogito/categorize.go:244:		WithIntrospectionTemperature	100.0%
github.com/zoobzio/cogito/compress.go:39:		NewCompress			100.0%
github.com/zoobzio/cogito/compress.go:49:		Process				76.7%
github.com/zoobzio/cogito/compress.go:131:		buildSessionText		100.0%
github.com/zoobzio/cogito/compress.go:143:		emitFailed			0.0%
github.com/zoobzio/cogito/compress.go:154:		Identity			100.0%
github.com/zoobzio/cogito/compress.go:159:		Schema				0.0%
github.com/zoobzio/cogito/compress.go:164:		Close				100.0%
github.com/zoobzio/cogito/compress.go:172:		WithThreshold			100.0%
github.com/zoobzio/cogito/compress.go:178:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/compress.go:184:		WithTemperature			0.0%
github.com/zoobzio/cogito/compress.go:190:		WithProvider			0.0%
github.com/zoobzio/cogito/converge.go:56:		NewConverge			100.0%
github.com/zoobzio/cogito/converge.go:74:		Process				86.2%
github.com/zoobzio/cogito/converge.go:242:		buildMergedContext		100.0%
github.com/zoobzio/cogito/converge.go:263:		emitFailed			100.0%
github.com/zoobzio/cogito/converge.go:274:		Identity			100.0%
github.com/zoobzio/cogito/converge.go:279:		Schema				0.0%
github.com/zoobzio/cogito/converge.go:285:		Close				85.7%
github.com/zoobzio/cogito/converge.go:300:		Scan				75.0%
github.com/zoobzio/cogito/converge.go:311:		WithProvider			0.0%
github.com/zoobzio/cogito/converge.go:317:		WithTemperature			100.0%
github.com/zoobzio/cogito/converge.go:323:		WithSynthesisTemperature	100.0%
github.com/zoobzio/cogito/converge.go:331:		AddProcessor			100.0%
github.com/zoobzio/cogito/converge.go:339:		RemoveProcessor			100.0%
github.com/zoobzio/cogito/converge.go:353:		ClearProcessors			100.0%
github.com/zoobzio/cogito/converge.go:361:		Processors			100.0%
github.com/zoobzio/cogito/decide.go:44:			NewDecide			100.0%
github.com/zoobzio/cogito/decide.go:55:			Process				75.0%
github.com/zoobzio/cogito/decide.go:136:		runIntrospection		100.0%
github.com/zoobzio/cogito/decide.go:147:		buildIntrospectionInput		100.0%
github.com/zoobzio/cogito/decide.go:165:		emitFailed			100.0%
github.com/zoobzio/cogito/decide.go:176:		Identity			0.0%
github.com/zoobzio/cogito/decide.go:181:		Schema				0.0%
github.com/zoobzio/cogito/decide.go:186:		Close				0.0%
github.com/zoobzio/cogito/decide.go:191:		Scan				71.4%
github.com/zoobzio/cogito/decide.go:206:		WithProvider			100.0%
github.com/zoobzio/cogito/decide.go:212:		WithTemperature			0.0%
github.com/zoobzio/cogito/decide.go:218:		WithIntrospection		100.0%
github.com/zoobzio/cogito/decide.go:224:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/decide.go:230:		WithReasoningTemperature	100.0%
github.com/zoobzio/cogito/decide.go:236:		WithIntrospectionTemperature	100.0%
github.com/zoobzio/cogito/discern.go:56:		NewDiscern			100.0%
github.com/zoobzio/cogito/discern.go:69:		Process				76.1%
github.com/zoobzio/cogito/discern.go:171:		runIntrospection		100.0%
github.com/zoobzio/cogito/discern.go:182:		buildIntrospectionInput		100.0%
github.com/zoobzio/cogito/discern.go:206:		emitFailed			100.0%
github.com/zoobzio/cogito/discern.go:217:		Identity			100.0%
github.com/zoobzio/cogito/discern.go:222:		Schema				0.0%
github.com/zoobzio/cogito/discern.go:228:		Close				100.0%
github.com/zoobzio/cogito/discern.go:250:		Scan				71.4%
github.com/zoobzio/cogito/discern.go:265:		WithProvider			0.0%
github.com/zoobzio/cogito/discern.go:271:		WithTemperature			0.0%
github.com/zoobzio/cogito/discern.go:277:		WithIntrospection		100.0%
github.com/zoobzio/cogito/discern.go:283:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/discern.go:289:		WithReasoningTemperature	0.0%
github.com/zoobzio/cogito/discern.go:295:		WithIntrospectionTemperature	0.0%
github.com/zoobzio/cogito/discern.go:303:		AddRoute			100.0%
github.com/zoobzio/cogito/discern.go:311:		RemoveRoute			100.0%
github.com/zoobzio/cogito/discern.go:319:		SetFallback			100.0%
github.com/zoobzio/cogito/discern.go:327:		HasRoute			100.0%
github.com/zoobzio/cogito/discern.go:335:		Routes				100.0%
github.com/zoobzio/cogito/discern.go:347:		ClearRoutes			100.0%
github.com/zoobzio/cogito/helpers.go:28:		Do				100.0%
github.com/zoobzio/cogito/helpers.go:41:		Transform			100.0%
github.com/zoobzio/cogito/helpers.go:54:		Effect				100.0%
github.com/zoobzio/cogito/helpers.go:73:		Mutate				100.0%
github.com/zoobzio/cogito/helpers.go:90:		Enrich				100.0%
github.com/zoobzio/cogito/helpers.go:107:		Sequence			100.0%
github.com/zoobzio/cogito/helpers.go:128:		Filter				100.0%
github.com/zoobzio/cogito/helpers.go:143:		Switch				100.0%
github.com/zoobzio/cogito/helpers.go:156:		Gate				100.0%
github.com/zoobzio/cogito/helpers.go:179:		Fallback			100.0%
github.com/zoobzio/cogito/helpers.go:189:		Retry				100.0%
github.com/zoobzio/cogito/helpers.go:199:		Backoff				0.0%
github.com/zoobzio/cogito/helpers.go:209:		Timeout				100.0%
github.com/zoobzio/cogito/helpers.go:224:		Handle				0.0%
github.com/zoobzio/cogito/helpers.go:238:		RateLimiter			100.0%
github.com/zoobzio/cogito/helpers.go:248:		CircuitBreaker			100.0%
github.com/zoobzio/cogito/helpers.go:267:		Concurrent			100.0%
github.com/zoobzio/cogito/helpers.go:281:		Race				100.0%
github.com/zoobzio/cogito/helpers.go:295:		WorkerPool			100.0%
github.com/zoobzio/cogito/introspection.go:22:		runIntrospection		83.3%
github.com/zoobzio/cogito/prioritize.go:51:		NewPrioritize			100.0%
github.com/zoobzio/cogito/prioritize.go:83:		NewPrioritizeFrom		100.0%
github.com/zoobzio/cogito/prioritize.go:95:		Process				67.6%
github.com/zoobzio/cogito/prioritize.go:181:		resolveItems			90.9%
github.com/zoobzio/cogito/prioritize.go:203:		runIntrospection		100.0%
github.com/zoobzio/cogito/prioritize.go:214:		buildIntrospectionInput		100.0%
github.com/zoobzio/cogito/prioritize.go:233:		emitFailed			0.0%
github.com/zoobzio/cogito/prioritize.go:244:		Identity			0.0%
github.com/zoobzio/cogito/prioritize.go:249:		Schema				0.0%
github.com/zoobzio/cogito/prioritize.go:254:		Close				0.0%
github.com/zoobzio/cogito/prioritize.go:259:		Scan				71.4%
github.com/zoobzio/cogito/prioritize.go:274:		WithProvider			0.0%
github.com/zoobzio/cogito/prioritize.go:280:		WithTemperature			0.0%
github.com/zoobzio/cogito/prioritize.go:286:		WithIntrospection		100.0%
github.com/zoobzio/cogito/prioritize.go:292:		WithSummaryKey			100.0%
github.com/zoobzio/cogito/prioritize.go:298:		WithReasoningTemperature	0.0%
github.com/zoobzio/cogito/prioritize.go:304:		WithIntrospectionTemperature	0.0%
github.com/zoobzio/cogito/provider.go:34:		SetProvider			100.0%
github.com/zoobzio/cogito/provider.go:41:		GetProvider			100.0%
github.com/zoobzio/cogito/provider.go:49:		WithProvider			100.0%
github.com/zoobzio/cogito/provider.go:54:		ProviderFromContext		100.0%
github.com/zoobzio/cogito/provider.go:64:		ResolveProvider			100.0%
github.com/zoobzio/cogito/reflect.go:41:		NewReflect			100.0%
github.com/zoobzio/cogito/reflect.go:50:		Process				15.4%
github.com/zoobzio/cogito/reflect.go:121:		emitFailed			0.0%
github.com/zoobzio/cogito/reflect.go:132:		Identity			100.0%
github.com/zoobzio/cogito/reflect.go:137:		Schema				0.0%
github.com/zoobzio/cogito/reflect.go:142:		Close				0.0%
github.com/zoobzio/cogito/reflect.go:149:		WithPrompt			100.0%
github.com/zoobzio/cogito/reflect.go:157:		WithUnpublishedOnly		100.0%
github.com/zoobzio/cogito/reflect.go:163:		WithProvider			0.0%
github.com/zoobzio/cogito/reset.go:34:			NewReset			100.0%
github.com/zoobzio/cogito/reset.go:42:			Process				100.0%
github.com/zoobzio/cogito/reset.go:88:			Identity			100.0%
github.com/zoobzio/cogito/reset.go:93:			Schema				0.0%
github.com/zoobzio/cogito/reset.go:98:			Close				100.0%
github.com/zoobzio/cogito/reset.go:105:			WithSystemMessage		100.0%
github.com/zoobzio/cogito/reset.go:113:			WithPreserveNote		100.0%
github.com/zoobzio/cogito/sift.go:54:			NewSift				100.0%
github.com/zoobzio/cogito/sift.go:66:			Process				68.4%
github.com/zoobzio/cogito/sift.go:164:			runIntrospection		100.0%
github.com/zoobzio/cogito/sift.go:175:			buildIntrospectionInput		100.0%
github.com/zoobzio/cogito/sift.go:194:			emitFailed			0.0%
github.com/zoobzio/cogito/sift.go:205:			Identity			100.0%
github.com/zoobzio/cogito/sift.go:210:			Schema				0.0%
github.com/zoobzio/cogito/sift.go:216:			Close				66.7%
github.com/zoobzio/cogito/sift.go:224:			Scan				71.4%
github.com/zoobzio/cogito/sift.go:239:			WithProvider			0.0%
github.com/zoobzio/cogito/sift.go:245:			WithTemperature			100.0%
github.com/zoobzio/cogito/sift.go:251:			WithIntrospection		100.0%
github.com/zoobzio/cogito/sift.go:257:			WithSummaryKey			100.0%
github.com/zoobzio/cogito/sift.go:263:			WithReasoningTemperature	100.0%
github.com/zoobzio/cogito/sift.go:269:			WithIntrospectionTemperature	100.0%
github.com/zoobzio/cogito/sift.go:275:			SetProcessor			100.0%
github.com/zoobzio/cogito/testing/helpers.go:15:	NewTestThought			100.0%
github.com/zoobzio/cogito/testing/helpers.go:21:	NewTestThoughtWithTrace		100.0%
github.com/zoobzio/cogito/testing/helpers.go:27:	RequireContent			66.7%
github.com/zoobzio/cogito/testing/helpers.go:39:	RequireNoContent		75.0%
github.com/zoobzio/cogito/thought.go:73:		New				100.0%
github.com/zoobzio/cogito/thought.go:94:		NewWithTrace			100.0%
github.com/zoobzio/cogito/thought.go:116:		AddNote				100.0%
github.com/zoobzio/cogito/thought.go:142:		SetContent			100.0%
github.com/zoobzio/cogito/thought.go:153:		SetNote				66.7%
github.com/zoobzio/cogito/thought.go:167:		GetNote				88.9%
github.com/zoobzio/cogito/thought.go:185:		GetContent			100.0%
github.com/zoobzio/cogito/thought.go:194:		GetMetadata			100.0%
github.com/zoobzio/cogito/thought.go:209:		GetLatestNote			100.0%
github.com/zoobzio/cogito/thought.go:221:		AllNotes			100.0%
github.com/zoobzio/cogito/thought.go:231:		GetBool				85.7%
github.com/zoobzio/cogito/thought.go:248:		GetFloat			85.7%
github.com/zoobzio/cogito/thought.go:263:		GetInt				85.7%
github.com/zoobzio/cogito/thought.go:287:		Clone				100.0%
github.com/zoobzio/cogito/thought.go:332:		PublishedCount			0.0%
github.com/zoobzio/cogito/thought.go:340:		SetPublishedCount		0.0%
github.com/zoobzio/cogito/thought.go:348:		GetUnpublishedNotes		100.0%
github.com/zoobzio/cogito/thought.go:363:		MarkNotesPublished		100.0%
github.com/zoobzio/cogito/thought.go:382:		RenderNotesToContext		100.0%
github.com/zoobzio/cogito/truncate.go:35:		NewTruncate			100.0%
github.com/zoobzio/cogito/truncate.go:46:		Process				87.5%
github.com/zoobzio/cogito/truncate.go:95:		emitFailed			0.0%
github.com/zoobzio/cogito/truncate.go:106:		Identity			100.0%
github.com/zoobzio/cogito/truncate.go:111:		Schema				0.0%
github.com/zoobzio/cogito/truncate.go:116:		Close				100.0%
github.com/zoobzio/cogito/truncate.go:124:		WithKeepFirst			100.0%
github.com/zoobzio/cogito/truncate.go:130:		WithKeepLast			100.0%
github.com/zoobzio/cogito/truncate.go:137:		WithThreshold			100.0%

Coverage report generated by Codecov

@codecov
Copy link

codecov bot commented Feb 22, 2026

Codecov Report

❌ Patch coverage is 93.10345% with 2 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
prioritize.go 80.00% 1 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
prioritize.go (1)

181-199: ⚠️ Potential issue | 🟡 Minor

Empty itemsKey produces a confusing error when items is also empty.

If NewPrioritize is called with a nil or empty items slice, len(r.items) == 0 falls through to Mode 2, where r.itemsKey is the zero-value "". t.GetContent("") then returns an error surfaced as prioritize: items note "" not found, which offers no useful signal to the caller.

The removed guard (itemsKey == "") was described as "unreachable" under normal API use, but both NewPrioritize(k, c, nil) and NewPrioritize(k, c, []string{}) still reach this path.

🛡️ Proposed fix
 // Mode 2: Read items from specific note key
+if r.itemsKey == "" {
+    return nil, fmt.Errorf("prioritize: no items provided")
+}
 itemsJSON, err := t.GetContent(r.itemsKey)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@prioritize.go` around lines 181 - 199, resolveItems in type Prioritize
currently falls through to calling t.GetContent with an empty itemsKey when
r.items is empty and r.itemsKey is the zero value, producing an unclear error;
add a guard at the start of resolveItems (or just before Mode 2) to check if
r.itemsKey == "" and return a clear error like "prioritize: no items to rank"
(or "prioritize: itemsKey is empty") so callers get a meaningful message;
reference resolveItems, Prioritize, r.items, r.itemsKey, NewPrioritize and
t.GetContent when making the change.
docs/2.learn/3.architecture.md (1)

143-165: ⚠️ Potential issue | 🟡 Minor

Update documentation example to match actual interface implementation — replace Name() with Identity() and Schema().

The example shows func (p *MyPrimitive) Name() pipz.Name on line 163, but all concrete implementations in the codebase (Decide, Discern, Sift, Prioritize) implement Identity() pipz.Identity and Schema() pipz.Node instead. The example will fail to satisfy pipz.Chainable as currently defined.

Suggested correction
-func (p *MyPrimitive) Name() pipz.Name { return pipz.Name(p.key) }
-func (p *MyPrimitive) Close() error    { return nil }
+func (p *MyPrimitive) Identity() pipz.Identity { return pipz.NewIdentity(p.key, "My custom primitive") }
+func (p *MyPrimitive) Schema() pipz.Node       { return pipz.Node{Identity: p.Identity(), Type: "my_primitive"} }
+func (p *MyPrimitive) Close() error            { return nil }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/2.learn/3.architecture.md` around lines 143 - 165, The doc example's
MyPrimitive does not implement the real pipz.Chainable interface because it
defines Name() instead of the required Identity() and Schema() methods; update
the example by removing func (p *MyPrimitive) Name() pipz.Name and adding two
methods: func (p *MyPrimitive) Identity() pipz.Identity that returns an identity
built from p.key, and func (p *MyPrimitive) Schema() pipz.Node that returns the
node/schema for the primitive (matching how other implementations like
Decide/Discern/Sift/Prioritize do it) so MyPrimitive implements pipz.Chainable
alongside Process and Close.
docs/5.reference/1.api.md (2)

6-6: ⚠️ Potential issue | 🟡 Minor

Stale updated date in frontmatter.

Same as the concepts doc — updated: 2025-01-11 should reflect the current revision date.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/5.reference/1.api.md` at line 6, The frontmatter in
docs/5.reference/1.api.md has a stale updated field ("updated: 2025-01-11");
update the updated value to the current revision date by editing the frontmatter
entry named updated so it matches the actual doc revision (replace the
"2025-01-11" value with the correct ISO date).

19-27: ⚠️ Potential issue | 🟡 Minor

Session type shown as *Session but actual type is *zyn.Session.

The documented struct shows Session *Session (line 24), but the implementation uses Session *zyn.Session. This is a minor doc simplification, but since this is an API reference doc, showing the correct qualified type would help users who need to interact with the Session field directly.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/5.reference/1.api.md` around lines 19 - 27, Update the API reference for
the Thought struct so the Session field shows the fully-qualified type used in
the codebase: change Session *Session to Session *zyn.Session in the Thought
definition, ensuring the doc matches the actual implementation and helps users
reference the correct package/type.
🧹 Nitpick comments (2)
thought.go (2)

361-375: Consider capturing publishedCount in a local variable before unlocking.

t.publishedCount is read at lines 372–373 after t.mu.Unlock() on line 367. While the doc contract forbids concurrent writes, capturing the value in a local (like previousPublished) keeps the pattern consistent and is more resilient against future contract violations.

♻️ Suggested tweak
 func (t *Thought) MarkNotesPublished(ctx context.Context) {
 	t.mu.Lock()
 	previousPublished := t.publishedCount
 	t.publishedCount = len(t.notes)
+	newPublished := t.publishedCount
 	t.mu.Unlock()
 
 	// Emit notes published event
 	capitan.Emit(ctx, NotesPublished,
 		FieldTraceID.Field(t.TraceID),
-		FieldPublishedCount.Field(t.publishedCount),
-		FieldUnpublishedCount.Field(t.publishedCount-previousPublished),
+		FieldPublishedCount.Field(newPublished),
+		FieldUnpublishedCount.Field(newPublished-previousPublished),
 	)
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@thought.go` around lines 361 - 375, MarkNotesPublished reads t.publishedCount
after releasing t.mu which risks seeing concurrent changes; capture the updated
publishedCount into a local variable before t.mu.Unlock() (e.g., newPublished :=
t.publishedCount) and use that local (and previousPublished) when calling
capitan.Emit (replace FieldPublishedCount.Field(t.publishedCount) and
FieldUnpublishedCount.Field(t.publishedCount-previousPublished) with
FieldPublishedCount.Field(newPublished) and
FieldUnpublishedCount.Field(newPublished-previousPublished)), keeping the mutex
hold only for the assignment and then unlocking.

114-139: AddNote always returns nil — error return is now vestigial.

With persistence removed, AddNote (and by extension SetContent/SetNote) has no failure path. The error return is dead weight that every caller must still handle. I understand removing it would broaden the breaking-change surface, so this may be intentional — just flagging it for awareness. If you plan a follow-up API cleanup, this would be a good candidate.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@thought.go` around lines 114 - 139, The AddNote method currently returns an
unused error; remove the vestigial error return by changing the signature of
Thought.AddNote to not return error and update its callers to stop checking an
error; also update related methods SetContent and SetNote (and any interfaces
that declare them) to drop error returns so the API is consistent, then adjust
all call sites, tests and any uses of the returned value accordingly; locate the
implementation by finding Thought.AddNote (and references to t.notes,
t.index.Store, t.UpdatedAt, and capitan.Emit) and update signatures, callers,
and docs/tests in one atomic change.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 59cac5f and 6c1e855.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (50)
  • amplify.go
  • analyze.go
  • api.go
  • assess.go
  • catalog.go
  • catalog_test.go
  • categorize.go
  • checkpoint.go
  • checkpoint_test.go
  • converge.go
  • decide.go
  • discern.go
  • discover.go
  • discover_test.go
  • docs/1.overview.md
  • docs/2.learn/1.quickstart.md
  • docs/2.learn/2.concepts.md
  • docs/2.learn/3.architecture.md
  • docs/5.reference/1.api.md
  • embedder.go
  • embedder_test.go
  • fetch.go
  • fetch_test.go
  • forget.go
  • forget_test.go
  • go.mod
  • memory.go
  • mock_memory_test.go
  • prioritize.go
  • recall.go
  • recall_test.go
  • reflect_test.go
  • relate.go
  • relate_test.go
  • restore.go
  • restore_test.go
  • seek.go
  • seek_test.go
  • sift.go
  • signals.go
  • signals_test.go
  • survey.go
  • survey_test.go
  • testing/benchmarks/benchmarks_test.go
  • testing/helpers.go
  • testing/helpers_test.go
  • thought.go
  • thought_test.go
  • vector.go
  • vector_test.go
💤 Files with no reviewable changes (29)
  • go.mod
  • testing/helpers_test.go
  • recall_test.go
  • discover_test.go
  • forget.go
  • fetch_test.go
  • forget_test.go
  • memory.go
  • checkpoint.go
  • restore.go
  • vector.go
  • mock_memory_test.go
  • relate.go
  • survey_test.go
  • vector_test.go
  • embedder_test.go
  • checkpoint_test.go
  • seek_test.go
  • recall.go
  • discover.go
  • catalog_test.go
  • catalog.go
  • fetch.go
  • restore_test.go
  • relate_test.go
  • signals.go
  • embedder.go
  • survey.go
  • seek.go
🧰 Additional context used
🧬 Code graph analysis (4)
thought_test.go (1)
thought.go (3)
  • Thought (48-69)
  • New (73-91)
  • NewWithTrace (94-112)
testing/benchmarks/benchmarks_test.go (1)
thought.go (1)
  • New (73-91)
thought.go (1)
signals.go (4)
  • ThoughtCreated (9-12)
  • FieldIntent (79-79)
  • FieldTraceID (80-80)
  • NotesPublished (33-36)
testing/helpers.go (1)
thought.go (3)
  • Thought (48-69)
  • New (73-91)
  • NewWithTrace (94-112)
🔇 Additional comments (28)
categorize.go (1)

122-122: LGTM — context propagated correctly to MarkNotesPublished.

converge.go (1)

224-224: LGTM — MarkNotesPublished(ctx) correctly called after all branch notes are merged into t.

signals_test.go (2)

140-140: LGTM — context.Background() is correct for the test publish call.


447-447: LGTM — explicit MarkNotesPublished emits a correlated NotesPublished event sufficient for the trace-ID correlation assertion.

reflect_test.go (1)

44-44: LGTM — uses the locally-declared ctx consistently with the rest of the test function.

thought_test.go (2)

9-17: LGTM — clean test helpers using context.Background() appropriately; accessible package-wide since all test files use package cogito.


30-32: LGTM — good regression coverage for UUID generation on both Thought.ID and Note.ID.

Also applies to: 84-86

amplify.go (1)

208-208: LGTM.

assess.go (1)

117-117: LGTM.

analyze.go (1)

125-125: LGTM.

decide.go (1)

120-120: LGTM — context propagation to MarkNotesPublished is correct.

ctx is already the request-scoped context in Process; passing it here enables cancellation propagation and context-aware signal emission in the publishing step.

discern.go (1)

134-134: LGTM — context propagation is correct, ordering is intentional.

Marking notes published before the routing phase (line 136) ensures routes receive only their own new notes as unpublished context, consistent with the accumulation model.

sift.go (1)

139-139: LGTM.

prioritize.go (1)

165-165: LGTM.

testing/benchmarks/benchmarks_test.go (1)

16-16: LGTM — API call-site updates are correct.

All benchmark functions correctly use the new cogito.New(ctx, label) signature (single *Thought return, no error), matching the updated thought.go.

docs/2.learn/3.architecture.md (3)

59-61: LGTM — diagram correctly reflects the simplified primitive set.


68-79: LGTM — architecture and infrastructure diagrams correctly drop the Memory/Embedder layer.


134-134: LGTM — signal description updated.

docs/1.overview.md (1)

3-63: LGTM — overview correctly reflects the simplified Thought-Note architecture.

docs/2.learn/1.quickstart.md (1)

27-127: LGTM — quickstart examples correctly reflect the simplified New(ctx, intent) API.

api.go (1)

1-78: Package documentation cleanly reflects the simplified two-concept architecture.

The doc comments are well-organized, accurately describe the remaining primitives, and the provider resolution hierarchy is clearly documented. No issues found.

docs/2.learn/2.concepts.md (1)

39-47: Nice addition documenting Clone behavior.

The new "Cloning for Parallel Processing" section is a helpful addition that aligns with the concurrency guidance in thought.go.

testing/helpers.go (1)

13-24: Clean simplification of test helpers.

Removing the MockMemory dependency and delegating directly to cogito.New / cogito.NewWithTrace is a good improvement. The thin wrappers still provide value by encapsulating the context.Background() call and keeping test code concise.

thought.go (2)

71-112: Constructor simplification looks good.

New and NewWithTrace are clean, emit the right signals, and the removal of the error return is consistent with the removal of persistence. No issues.


277-329: Clone correctly deep-copies notes and rebuilds the index.

Metadata maps are properly deep-copied. The removal of Embedding from the clone logic is consistent with the Note struct changes.

docs/5.reference/1.api.md (3)

232-240: GetProvider is correctly documented. The function exists in provider.go and matches the documented signature func GetProvider() Provider.


154-177: Documentation signatures are accurate. All Reflect API methods (NewReflect, WithPrompt, WithProvider, WithUnpublishedOnly) and Reset API methods (NewReset, WithSystemMessage, WithPreserveNote) match their implementations.


220-229: Documentation signatures are accurate.

All pipeline helpers (Sequence, Filter, Switch, Gate, Fallback, Retry, Backoff, Timeout, Concurrent, Race) correctly show pipz.Identity as the first parameter and match their actual implementations in helpers.go.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/2.learn/2.concepts.md`:
- Line 6: Frontmatter has a stale "updated" field ("updated: 2025-01-11");
update the updated frontmatter key in this document (the "updated" field in
docs/2.learn/2.concepts.md) to the current date (e.g., 2026-02-22) so the
frontmatter reflects the PR’s revision date.

---

Outside diff comments:
In `@docs/2.learn/3.architecture.md`:
- Around line 143-165: The doc example's MyPrimitive does not implement the real
pipz.Chainable interface because it defines Name() instead of the required
Identity() and Schema() methods; update the example by removing func (p
*MyPrimitive) Name() pipz.Name and adding two methods: func (p *MyPrimitive)
Identity() pipz.Identity that returns an identity built from p.key, and func (p
*MyPrimitive) Schema() pipz.Node that returns the node/schema for the primitive
(matching how other implementations like Decide/Discern/Sift/Prioritize do it)
so MyPrimitive implements pipz.Chainable alongside Process and Close.

In `@docs/5.reference/1.api.md`:
- Line 6: The frontmatter in docs/5.reference/1.api.md has a stale updated field
("updated: 2025-01-11"); update the updated value to the current revision date
by editing the frontmatter entry named updated so it matches the actual doc
revision (replace the "2025-01-11" value with the correct ISO date).
- Around line 19-27: Update the API reference for the Thought struct so the
Session field shows the fully-qualified type used in the codebase: change
Session *Session to Session *zyn.Session in the Thought definition, ensuring the
doc matches the actual implementation and helps users reference the correct
package/type.

In `@prioritize.go`:
- Around line 181-199: resolveItems in type Prioritize currently falls through
to calling t.GetContent with an empty itemsKey when r.items is empty and
r.itemsKey is the zero value, producing an unclear error; add a guard at the
start of resolveItems (or just before Mode 2) to check if r.itemsKey == "" and
return a clear error like "prioritize: no items to rank" (or "prioritize:
itemsKey is empty") so callers get a meaningful message; reference resolveItems,
Prioritize, r.items, r.itemsKey, NewPrioritize and t.GetContent when making the
change.

---

Nitpick comments:
In `@thought.go`:
- Around line 361-375: MarkNotesPublished reads t.publishedCount after releasing
t.mu which risks seeing concurrent changes; capture the updated publishedCount
into a local variable before t.mu.Unlock() (e.g., newPublished :=
t.publishedCount) and use that local (and previousPublished) when calling
capitan.Emit (replace FieldPublishedCount.Field(t.publishedCount) and
FieldUnpublishedCount.Field(t.publishedCount-previousPublished) with
FieldPublishedCount.Field(newPublished) and
FieldUnpublishedCount.Field(newPublished-previousPublished)), keeping the mutex
hold only for the assignment and then unlocking.
- Around line 114-139: The AddNote method currently returns an unused error;
remove the vestigial error return by changing the signature of Thought.AddNote
to not return error and update its callers to stop checking an error; also
update related methods SetContent and SetNote (and any interfaces that declare
them) to drop error returns so the API is consistent, then adjust all call
sites, tests and any uses of the returned value accordingly; locate the
implementation by finding Thought.AddNote (and references to t.notes,
t.index.Store, t.UpdatedAt, and capitan.Emit) and update signatures, callers,
and docs/tests in one atomic change.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6c1e855 and f3698b0.

📒 Files selected for processing (5)
  • docs/1.overview.md
  • docs/2.learn/1.quickstart.md
  • docs/2.learn/2.concepts.md
  • docs/2.learn/3.architecture.md
  • docs/5.reference/1.api.md
🔇 Additional comments (7)
docs/1.overview.md (2)

3-3: LGTM — all terminology updates are accurate and internally consistent.

Description, heading blurb, architecture name, Note description, and Next Steps link all align correctly with the PR's removal of Memory/Embedder/Vector/Catalog concepts.

Also applies to: 12-12, 16-16, 19-19, 62-62


27-27: No changes needed — "capitan" is the correct library name, not a typo. The codebase imports and uses github.com/zoobzio/capitan extensively throughout (in thought.go, signals.go, and multiple step files), and the documentation on line 27 is accurate and consistent with the implementation.

docs/2.learn/1.quickstart.md (1)

5-6: LGTM!

All changed lines are consistent with the PR objectives — provider-only setup, simplified New(ctx, intent) constructor calls, and the updated "Thought and Note" link.

Also applies to: 27-27, 45-45, 48-48, 50-50, 108-108, 127-127

docs/2.learn/3.architecture.md (1)

59-79: LGTM!

Diagram removals (Memory/Embedder from infrastructure, Recall/Seek from primitives, Memory from Thought schema), the NoteAdded description change, MarkNotesPublished(ctx) call-site update, and performance-list renumbering are all clean and internally consistent.

Also applies to: 134-134, 158-158, 170-171

docs/2.learn/2.concepts.md (1)

24-24: LGTM!

New(ctx, intent) constructor, auto-generated ID documentation, removed Note.Embedding, and MarkNotesPublished(ctx) are all consistent across the PR.

Also applies to: 34-34, 55-55, 103-103

docs/5.reference/1.api.md (2)

20-20: LGTM!

Constructor simplifications (New, NewWithTrace), Thought.ID comment update, TaskID removal, and MarkNotesPublished(ctx context.Context) signature are accurate and consistent with the rest of the PR.

Also applies to: 33-34, 54-54


154-177: LGTM!

Reflection and Session Management reorganisation (NewReflect(key string) with WithPrompt/WithUnpublishedOnly, NewReset(key string) with WithSystemMessage/WithPreserveNote) is clean and well-structured.

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/5.reference/1.api.md`:
- Around line 220-229: Examples pass string literals where a pipz.Identity
struct is required; update all quickstart and README examples that call
functions like Sequence, Filter, Switch, Gate, Fallback, Retry, Backoff,
Timeout, Concurrent, Race etc. to construct identities using
pipz.NewIdentity("name", "<description>") instead of raw strings (e.g., replace
Sequence("ticket-triage", ...) with Sequence(pipz.NewIdentity("ticket-triage",
"<description>"), ...)); ensure every occurrence in docs/quickstart and README
uses pipz.NewIdentity so the signature matches the pipz.Identity parameter.

---

Duplicate comments:
In `@docs/2.learn/2.concepts.md`:
- Around line 3-7: The frontmatter "updated" field was corrected to 2026-02-21;
please ensure the frontmatter key updated uses the ISO date format (YYYY-MM-DD)
and accurately reflects the last edit, and verify the other frontmatter keys
like "description", "author", and "tags" remain current (update their values if
they are stale) so the document metadata is consistent.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
docs/2.learn/1.quickstart.md (1)

47-77: ⚠️ Potential issue | 🟡 Minor

Add missing imports to the Step 2 code example.

The processTicket() function uses pipz.NewIdentity() and fmt.Printf() but the code block (lines 47–77) does not show import statements for either pipz or fmt. New users will encounter compilation errors.

Add the following imports to the Step 2 example:

📝 Suggested fix
 ```go
+import (
+    "fmt"
+    "github.com/zoobzio/pipz"
+)
+
 func processTicket(ctx context.Context, ticketText string) error {
     // Create a thought
     thought := cogito.New(ctx, "triage support ticket")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/2.learn/1.quickstart.md` around lines 47 - 77, The example for
processTicket is missing imports which will cause compile errors; add the fmt
package and the pipz module import used by pipz.NewIdentity at the top of the
code example (i.e., include import "fmt" and import "github.com/zoobzio/pipz")
so the processTicket(ctx, ticketText string) function can call fmt.Printf and
pipz.NewIdentity without errors.
🧹 Nitpick comments (1)
docs/2.learn/1.quickstart.md (1)

108-108: Spelling inconsistency: "analyse" vs. "analyze".

The string literal uses British spelling ("analyse feedback") while the project API consistently uses American spelling (NewAnalyze, NewAnalyze[TicketData]). Aligning to "analyze feedback" keeps the docs consistent with the codebase naming convention.

📝 Suggested fix
-    thought := cogito.New(ctx, "analyse feedback")
+    thought := cogito.New(ctx, "analyze feedback")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@docs/2.learn/1.quickstart.md` at line 108, Spelling inconsistency: change the
string literal passed to cogito.New from "analyse feedback" to the American
spelling "analyze feedback" to match the project API naming (e.g., NewAnalyze
and NewAnalyze[TicketData]); update the example invocation in the docs
(cogito.New(...)) so it uses "analyze feedback" for consistency.
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f3698b0 and caa5921.

📒 Files selected for processing (1)
  • docs/2.learn/1.quickstart.md
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@docs/2.learn/1.quickstart.md`:
- Around line 47-77: The example for processTicket is missing imports which will
cause compile errors; add the fmt package and the pipz module import used by
pipz.NewIdentity at the top of the code example (i.e., include import "fmt" and
import "github.com/zoobzio/pipz") so the processTicket(ctx, ticketText string)
function can call fmt.Printf and pipz.NewIdentity without errors.

---

Nitpick comments:
In `@docs/2.learn/1.quickstart.md`:
- Line 108: Spelling inconsistency: change the string literal passed to
cogito.New from "analyse feedback" to the American spelling "analyze feedback"
to match the project API naming (e.g., NewAnalyze and NewAnalyze[TicketData]);
update the example invocation in the docs (cogito.New(...)) so it uses "analyze
feedback" for consistency.

@zoobzio zoobzio merged commit e0adee5 into main Feb 22, 2026
13 checks passed
@zoobzio zoobzio deleted the refactor/cut-fat branch February 22, 2026 04:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant